home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / misc / emu / msh-156.lha / util / loadconv.c < prev    next >
C/C++ Source or Header  |  1996-12-22  |  3KB  |  141 lines

  1. /*-
  2.  * $Id: loadconv.c,v 1.56 1996/12/22 01:22:42 Rhialto Rel $
  3.  *
  4.  *  LOADCONV.C
  5.  *
  6.  *  This code is (C) Copyright 1992 by Olaf Seibert. All rights reserved.
  7.  *  May not be used or copied without a licence.
  8. -*/
  9.  
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include "han.h"
  13. #include "hanconv.h"
  14.  
  15. #ifndef EXEC_TYPES_H
  16. #include <exec/types.h>
  17. #endif
  18. #ifndef EXEC_MEMORY_H
  19. #include <exec/memory.h>
  20. #endif
  21. #ifndef LIBRARIES_DOSEXTENS_H
  22. #include <libraries/dosextens.h>
  23. #endif
  24.  
  25. #ifndef CLIB_DOS_PROTOS_H
  26. #include <clib/dos_protos.h>
  27. #endif
  28.  
  29. const char    idString[] = "$\VER: LoadConv $Revision: 1.56 $ $Date: 1996/12/22 01:22:42 $\r\n";
  30.  
  31. /*
  32.  * Arg2 -> Arg2, the world turned upside down.
  33.  */
  34.  
  35. long
  36. dos_packet1a(struct MsgPort *port, long type, long arg2, long arg3)
  37. {
  38.     struct StandardPacket *sp;
  39.     struct MsgPort *rp;
  40.  
  41.     if ((rp = CreatePort(NULL, 0)) == NULL)
  42.     return DOSFALSE;
  43.     if ((sp = AllocMem((long)sizeof(*sp), MEMF_PUBLIC|MEMF_CLEAR)) == NULL) {
  44.     DeletePort(rp);
  45.     return DOSFALSE;
  46.     }
  47.     sp->sp_Msg.mn_Node.ln_Name = (char *)&sp->sp_Pkt;
  48.     sp->sp_Pkt.dp_Link = &sp->sp_Msg;
  49.     sp->sp_Pkt.dp_Port = rp;
  50.     sp->sp_Pkt.dp_Type = type;
  51.     sp->sp_Pkt.dp_Arg2 = arg2;
  52.     sp->sp_Pkt.dp_Arg3 = arg3;
  53.     PutMsg(port, &sp->sp_Msg);
  54.     WaitPort(rp);
  55.     GetMsg(rp);
  56.     arg2 = sp->sp_Pkt.dp_Arg2;
  57.     FreeMem(sp, (long)sizeof(*sp));
  58.     DeletePort(rp);
  59.  
  60.     return arg2;
  61. }
  62.  
  63. unsigned char *
  64. CopyTable(unsigned char **ptr, unsigned char *init)
  65. {
  66.     Forbid();
  67.     if (*ptr == 0) {
  68.     *ptr = AllocMem(256L, 0L);
  69.     }
  70.  
  71.     if (*ptr != 0) {
  72.     CopyMem(init, *ptr, 256L);
  73.     }
  74.     Permit();
  75.  
  76.     return *ptr;
  77. }
  78.  
  79. int
  80. main(int argc, char **argv)
  81. {
  82.     struct MsgPort *filehandler;
  83.     struct PrivateInfo *private;
  84.     int         conversion;
  85.     unsigned char   table[256];
  86.     BPTR        file;
  87.  
  88.     if (argc != 4) {
  89.     puts("Usage: loadconv MSH-DEV: C file\n\twhere C is the conversion id.");
  90.     return 10;
  91.     }
  92.  
  93.     filehandler = DeviceProc(argv[1]);
  94.     if (filehandler == 0) {
  95.     puts("Cannot find device.");
  96.     return 10;
  97.     }
  98.  
  99.     private = (struct PrivateInfo *)
  100.     dos_packet1a(filehandler, ACTION_CURRENT_VOLUME, MSH_MAGIC, 1);
  101.  
  102.     if ((long)private == MSH_MAGIC ||
  103.     private == 0 ||
  104.     private->Revision != PRIVATE_REVISION ||
  105.     private->Size != sizeof(*private)) {
  106.     puts("Incompatible filesystem.");
  107.     return 10;
  108.     }
  109.     puts(private->RCSId + 1);
  110.  
  111.     conversion = argv[2][0] & 31;
  112.     if (conversion >= ConvFence)
  113.     conversion = ConvNone;
  114.  
  115.     if (conversion == ConvNone ||
  116.     conversion > private->NumConversions) {
  117.     puts("Incorrect conversion type.");
  118.     return 10;
  119.     }
  120.  
  121.     conversion -= ConvNone + 1;     /* Make it 0-based */
  122.  
  123.     file = Open(argv[3], MODE_OLDFILE);
  124.     if (file == 0) {
  125.     puts("Cannot open file.");
  126.     return 10;
  127.     }
  128.  
  129.     if (Read(file, table, sizeof(table)) == 256)
  130.     CopyTable(private->Table[conversion].to, table);
  131.  
  132.     if (Read(file, table, sizeof(table)) == 256)
  133.     CopyTable(private->Table[conversion].from, table);
  134.  
  135.     Close(file);
  136.  
  137.     dos_packet1a(filehandler, ACTION_CURRENT_VOLUME, MSH_MAGIC, -1);
  138.  
  139.     return 0;
  140. }
  141.